先上demo:
Animation Easing | Fabric.js Demos (fabricjs.com)
fabric.js 使用物件的方式來控制,可以讓新增動畫的方式變得很容易,所有要讓物件動的設定,透過 animate() 直接加在物件本體上就好。
Fabric.js 提供了簡單易用的動畫 API,可以輕鬆地為畫布上的對象添加動畫效果。概念跟 css 的 animation 很像,可以對物件的外觀大小、位置、顏色做變化。
基本動畫主要通過在 Canvas.Object 上使用 animate() 方法實現:
object.animate(property, value, options);
property: 要進行動畫的屬性名稱(如 'left', 'top', 'opacity' 等)value: 動畫結束時該屬性的目標值options: 一個可選的配置對象,用於設置動畫的詳細參數options 對象可以加上以下屬性:duration: 動畫持續時間(毫秒)onChange: 每次屬性變化時調用的回調函數onComplete: 動畫完成時調用的回調函數easing: 緩動函數,控制動畫的速度變化property 可填入的屬性| 項目類別 | 屬性 |
|---|---|
| 位置相關 | left, top, angle (旋轉角度) |
| 尺寸相關 | width, height, scaleX, scaleY |
| 外觀相關 | opacity, fill (填充顏色), stroke (邊框顏色), strokeWidth (邊框寬度) |
| 變形相關 | skewX, skewY |
| 陰影相關 | shadow.offsetX, shadow.offsetY, shadow.blur, shadow.color |
| 邊框相關 | rx (矩形圓角半徑,x方向), ry (矩形圓角半徑,y方向) |
| 文本相關(適用於 Text 對象) | fontSize, fontWeight, letterSpacing |
| 漸變相關 | fill.coords.x1, fill.coords.y1, fill.coords.x2, fill.coords.y2, fill.colorStops[0].offset, fill.colorStops[1].offset, 等 |
| 路徑相關(適用於 Path 對象) | path[0][1], path[1][1], 等 (改變路徑的具體點) |
easing: 緩動函數可填入項目這些 easing 函數都在 fabric.util.ease 對象中定義。
| Easing 函數名 | 描述 |
|---|---|
| easeInQuad | 二次方緩入 |
| easeOutQuad | 二次方緩出 |
| easeInOutQuad | 二次方緩入緩出 |
| easeInCubic | 三次方緩入 |
| easeOutCubic | 三次方緩出 |
| easeInOutCubic | 三次方緩入緩出 |
| easeInQuart | 四次方緩入 |
| easeOutQuart | 四次方緩出 |
| easeInOutQuart | 四次方緩入緩出 |
| easeInQuint | 五次方緩入 |
| easeOutQuint | 五次方緩出 |
| easeInOutQuint | 五次方緩入緩出 |
| easeInSine | 正弦緩入 |
| easeOutSine | 正弦緩出 |
| easeInOutSine | 正弦緩入緩出 |
| easeInExpo | 指數緩入 |
| easeOutExpo | 指數緩出 |
| easeInOutExpo | 指數緩入緩出 |
| easeInCirc | 圓形曲線緩入 |
| easeOutCirc | 圓形曲線緩出 |
| easeInOutCirc | 圓形曲線緩入緩出 |
| easeInElastic | 彈性緩入 |
| easeOutElastic | 彈性緩出 |
| easeInOutElastic | 彈性緩入緩出 |
| easeInBack | 回退緩入 |
| easeOutBack | 回退緩出 |
| easeInOutBack | 回退緩入緩出 |
| easeInBounce | 彈跳緩入 |
| easeOutBounce | 彈跳緩出 |
| easeInOutBounce | 彈跳緩入緩出 |
製作一個讓紅色矩形在1秒內,從左邊100px的位置移動到300px的位置,使用彈跳效果,並在動畫結束時印出 'Animation completed'
rect.animate('left', 300, {
duration: 1000,
onChange: canvas.renderAll.bind(canvas),
onComplete: function() {
console.log('Animation completed');
},
easing: fabric.util.ease.easeOutBounce
});
對於更複雜的動畫效果,Fabric.js 提供了更高級的功能:
可以將多個動畫串聯在一起,實現連續的動畫效果。
rect.animate('left', 500, {
onChange: canvas.renderAll.bind(canvas),
duration: 1000
}).animate('top', 500, {
onChange: canvas.renderAll.bind(canvas),
duration: 1000
});
fabric.util.animate :那你可能會問,如果我想要我的物件會同時從圓形變成方形、向左移、顏色從紅色變藍色,要怎麼做?以上的方式都能一次執行一種屬性的變動?
那你可以使用 fabric.util.animate 來創建自定義動畫。
這個方法提供了更靈活的動畫控制,讓我們可以同時改變多個屬性或創建更複雜的動畫效果。
他的架構跟 animate() 有點相似,但多了起始值與結束值,讓你可以跑畫面的迴圈,並且讓你可以對不只一個物件作用。
fabric.util.animate({
startValue: startValue,
endValue: endValue,
duration: duration,
onChange: function(value) {
// 在這裡更新對象的屬性
},
onComplete: function() {
// 動畫完成後的回調
},
easing: easingFunction
});
startValue: 起始值endValue: 結束值duration: 持續時間onChange: 變化時的回調函數onComplete: 完成時的回調函數easing: 緩動函數概念上,把以上參數寫成 for 迴圈會長這樣:
for(let value = startValue; value <= endValue; value ++){
onChange(value) //做每一次變動畫面要做的事
}
這個例子會同時改變矩形的位置和旋轉角度
var rect = new fabric.Rect({
left: 100,
top: 100,
width: 50,
height: 50,
fill: 'red'
});
canvas.add(rect);
fabric.util.animate({
startValue: 0,
endValue: 100,
duration: 1000,
onChange: function(value) { //迴圈起始的 value 會從上面設定的 startValue 開始,在 endValue 時結束
rect.set({
left: 100 + 200 * value,
top: 100 + 100 * value,
angle: 360 * value
});
canvas.renderAll(); // 每次畫面更變時重新渲染畫布
//每做完一次 value +1
},
onComplete: function() {
console.log('Animation completed');
},
easing: fabric.util.ease.easeInOutQuad
});
可以同時為多個對象添加動畫效果。一整組一起動。
fabric.util.animate({
duration: 1000,
onChange: function(value) {
// 會需要寫迴圈讓每個群組內物件都被處理到
group.getObjects().forEach(function(obj) {
obj.set('opacity', value);
});
canvas.renderAll();
},
onComplete: function() {
console.log('Animation completed');
},
startValue: 0,
endValue: 1
});
可以讓對象沿著特定的路徑移動。
var path = new fabric.Path('M 0 0 L 300 100 L 200 300 z');
var startPoint = path.getPointAtLength(0);
var endPoint = path.getPointAtLength(path.getTotalLength());
rect.animate('left', endPoint.x, {
duration: 2000,
onChange: canvas.renderAll.bind(canvas),
onComplete: function() {
console.log('Animation completed');
},
easing: function(t, b, c, d) {
var point = path.getPointAtLength(t * path.getTotalLength());
rect.set('top', point.y);
return fabric.util.ease.easeInOutQuad(t, b, c, d);
}
});
這些動畫效果可以組合使用,創造出更加複雜和吸引人的視覺效果。
Fabric.js 的動畫系統非常靈活,讓我們可以用很能夠滿足各種動畫需求。
其實也可以使用滑鼠事件來觸發動畫
grow-shrink animation using FabricJS
---from Create grow/shrink animation using FabricJS | by Mandev | Medium